/*
 * @Author: lirl
 * @Date: 2022-07-18 10:15:52
 * @Description: axios拦截器
 */
/**
 * 全局拦截请求同时请求时设置token信息
 */
// 引入axios对象
import axios from 'axios';
import { window } from 'globalthis/implementation';
import { collectLogs } from 'jdf-jssdk';
import settings from '@/settings/settings';
import { getToken, setToken } from '../storage-util';
import {
  bizServiceURL,
  environment,
  ssoLoginPageURL,
  tokenCodes
} from '../constants';

// 引入全局路由对象
const router = require('@/router/index').default;

// webpack 环境变量，构建时自动替换现网动态请求域名前缀
axios.defaults.baseURL = bizServiceURL;
// 设置请求超时时间
axios.defaults.timeout = settings.timeout;

// axios请求拦截器 用以在请求时将token绑定到请求头上
axios.interceptors.request.use(
  (config) => {
    const { headers } = config;
    const token = getToken();
    if (token) {
      headers[settings.bizToke] = token;
    }
    // 如果请求方法为get则转码其中的中文参数
    if (config.method === 'get') {
      // 加入标识，防止ie浏览器下缓存
      // eslint-disable-next-line no-param-reassign, dot-notation
      config.params['_unique'] = (new Date()).getTime();
    }
    return config;
  },
  err => Promise.reject(err)
);

// axios响应拦截器 用以在响应时将token存入sessionStorage中
axios.interceptors.response.use(
  (response) => {
    // 如果响应状态不是401 则将响应头中的Authorization字段存入sessionStorage
    const { authorization } = response.headers;
    authorization && setToken(authorization);
    const { data, config: { responseType = '' } } = response;
    // 如果返回类型是text/blob/arraybuffer，则直接返回response
    if (['text', 'blob', 'arraybuffer'].includes(responseType)) {
      return response;
    }
    // 判断result为false的时候，抛出异常
    // code为token相关在uat环境进行
    // const tokenCodes = ['B004-000-10', 'B004-000-11', 'B004-000-09'];
    if (['FH_PUB_OK', '200'].includes(data.code) && !(data.result === false || data.success === false)) {
      return response;
    }

    collectLogs({}, response.config?.url, response);

    if (tokenCodes.includes(data.code)) {
      window.open(ssoLoginPageURL, '_self');
      throw new Error();
    } else {
      throw new Error(data.errorUser || data.message);
    }
  },
  (err) => {
    const { response } = err;
    if (response) {
      collectLogs({}, response.config?.url, response);
    }
    // 如果错误状态为401,清空token,跳转登录页
    if (err.response?.status === 401) {
      setToken('');
      // 正式环境
      if (environment === 'prod') {
        window.open(ssoLoginPageURL, '_self');
      } else {
        // 非正式环境
        router.push(`/${process.env.VUE_APP_LOGIN_URL}`);
      }
    }
    return Promise.reject(err);
  }
);

export default axios;
